import requests
import time
import random
import pandas as pd
import os
from fake_useragent import UserAgent  # 引入 fake_useragent

# 股票数据文件路径列表
# csv_files = ["data/sh_ashares.csv", "data/sz_ashares.csv"]
csv_files = ["data/sz_ashares.csv"]

# K线数据保存目录
output_dir = "data/股票目录"

# 确保输出目录存在
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 东方财富API的URL
base_url = "https://push2his.eastmoney.com/api/qt/stock/kline/get"

# 使用 fake_useragent 生成 User-Agent 对象
ua = UserAgent()

def get_random_delay():
    """生成随机延迟时间，模拟人类行为"""
    return random.uniform(1, 5)  # 1-5 秒的随机延迟

def process_stock_data(csv_file):
    """处理单个股票数据文件"""
    try:
        df = pd.read_csv(csv_file)
        stock_codes = df['f12'].tolist()  # 股票代码
        stock_names = df['f14'].tolist()  # 股票名称
    except FileNotFoundError:
        print(f"文件未找到: {csv_file}")
        return
    except KeyError as e:
        print(f"CSV文件缺少必要的列: {e}")
        return

    # 循环遍历股票代码和名称
    for code, name in zip(stock_codes, stock_names):
        # 将股票代码转换为字符串
        code_str = str(code)

        # 构建请求参数
        timestamp = int(time.time() * 1000)
        cb_value = f"jQuery{random.randint(10000000000000000000, 99999999999999999999)}_{timestamp}"

        # 根据股票代码判断交易所
        exchange_code = "1" if csv_file == "data/sh_ashares.csv" else "0" # 1代表上海，0代表深圳

        # 确保股票代码是6位数字符串，深证A股需要补0
        formatted_code = code_str.zfill(6)

        # 构建文件名，包含交易所信息和格式化后的代码
        filename = os.path.join(output_dir, f"stock_data({exchange_code}_{formatted_code}_{name}).txt")

        # ************************ 检查本地文件是否存在 ************************
        if os.path.exists(filename):
            print(f"股票 {name} ({formatted_code}) 的数据已存在，跳过")
            continue  # 如果文件存在，则跳过当前股票

        params = {
            "cb": cb_value,
            "secid": f"{exchange_code}.{code_str}",  # 注意这里要加上交易所代码前缀
            "ut": "fa5fd1943c7b386f172d6893dbfba10b",
            "fields1": "f1,f2,f3,f4,f5,f6",
            "fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
            "klt": "101",
            "fqt": "1",
            "beg": "20240101",
            "end": "20501231",
            "smplmt": "1040.6",
            "lmt": "1000000",
            "_": str(timestamp)
        }

        # 发送请求
        try:
            # 每次请求都使用新的 User-Agent
            headers = {
                "User-Agent": ua.random  # 使用随机 User-Agent
            }
            response = requests.get(base_url, headers=headers, params=params)
            response.raise_for_status()  # 检查请求是否成功

            data = response.text

            # 保存数据到文件
            with open(filename, 'w', encoding='utf-8') as f:
                f.write(data)

            print(f"股票 {name} ({formatted_code}) 的数据已保存到 {filename}")

        except requests.exceptions.RequestException as e:
            print(f"股票 {name} ({formatted_code}) 请求发生错误: {e}")
        except Exception as e:
            print(f"处理股票 {name} ({formatted_code}) 数据时发生错误: {e}")

        # 为了避免请求过于频繁，添加随机延时
        time.sleep(get_random_delay())


def main():
    # 遍历股票数据文件列表
    for csv_file in csv_files:
        print(f"正在处理文件: {csv_file}")
        process_stock_data(csv_file)
        print(f"文件 {csv_file} 处理完毕")


if __name__ == '__main__':
    main()